// 头文件包含了函数声明，宏定义，结构体声明，变量声明。
// 比如stdio.h系统头文件包含了printf，scanf, fopen函数
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
// 介绍基础数据类型。

// 计算机储存：
// 位=1bit,最小储存单元，只能表示0,1。表示二进制。编程没有bit类型(bool类型实际占用空间为1byte。虽然有int i:1;这种定义，但是他实际占用空间4字节)。
// 字节Byte=8bits,基本数据单位。比如内存条为1T=1024G=2^10G=2^20M=2^30K=2^40byte的空间。
// 二进制   16进制  10进制
// 00000000 0x00   0
// 00000001 0x01   1
// 00000010 0x02   2
// 00000011 0x03   3
// 00000100 0x04   4
// 00000101 0x05   5
// 00000110 0x06   6
// 00000111 0x07   7
// 00001000 0x08   8
// 00001001 0x09   9
// 00001010 0x0a  10
// 00001011 0x0b  11
// 00001100 0x0c  12
// 00001101 0x0d  13
// 00001110 0x0e  14
// 00001111 0x0f  15
// 00010000 0x10  16
// 00010001 0x11  17
// 4位二进制刚好组成1位16进制

// 二进制：b01101001,对应十进制105，对应16进制0X69。可以通过计算器程序员模式查看。
// 二进制计算跟十进制类似：
//   b01011101
// + b11100011
// =b101000000
// char表示的有符号数，长度8bits，最高位0表示正，1表示负。他能表示-128到127
// uchar表示无符号数，0-255对应0x00-0xff
// 补码及作用：正数直接表示为二进制即可，负数为其正数取反加一。作用是加减法，计算器方便直接执行加运算。
// 2=b00000010
// -2则先用2=b00000010取反得到b11111101,然后加1得到b11111110。这就是计算机保存的内容。
// 试一下加法：2+(-2)=0
//   b00000010
// + b11111110
// =b000000000
// uint_8与int_8 ++情况一致。

int main(int argc, char **argv)
{
    char tmpi8 = 156;
    unsigned char tmpu8 = tmpi8;
    printf("char value:%d, unsigned char val:%d\n", tmpi8, tmpu8);
    printf("char value:0x%02x, unsigned char val:0x%02x\n", tmpi8, tmpu8);

    tmpu8 = (unsigned char)tmpi8;// 强制转换
    printf("char value1:%d, unsigned char val:%d\n", tmpi8, tmpu8);
    printf("char value:0x%02x, unsigned char val:0x%02x\n", tmpi8, tmpu8);

    int tmpi32 = 0x11aa;
    tmpi8 = tmpu8 = tmpi32;
    printf("int to char, char value:%d, unsigned char val:%d\n", tmpi8, tmpu8);
    printf("char value:0x%02x, unsigned char val:0x%02x\n", tmpi8, tmpu8);

    tmpi8 = tmpu8 = (unsigned char)tmpi32;// 强制转换
    printf("int to char1, char value:%d, unsigned char val:%d\n", tmpi8, tmpu8);
    printf("char value:0x%02x, unsigned char val:0x%02x\n", tmpi8, tmpu8);

    tmpi8 = -50;
    tmpu8 = tmpi8;
    tmpi32 = tmpi8;
    printf("c to int, char value:%d, unsigned char val:%d, int val=%d\n", tmpi8, tmpu8, tmpi32);


    float tmpfloat = -1004.111f;
    tmpi32 = tmpfloat;
    printf("float to int,tmpfloat:%f, tmpi32:%d\n", tmpfloat, tmpi32);
    tmpi32 = (int)tmpfloat;
    printf("float to int1,tmpfloat:%f, tmpi32:%d\n", tmpfloat, tmpi32);
    tmpi32 = 2001;
    tmpfloat = tmpi32;
    printf("int to float,tmpfloat:%f, tmpi32:%d\n", tmpfloat, tmpi32);
    tmpfloat = (float)tmpi32;
    printf("int to float1,tmpfloat:%f, tmpi32:%d\n", tmpfloat, tmpi32);
    return 1;
}

// 输出：
//  ./test a b c
//  hello world!
